package com.bkhech.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * ThreadPoolConfig
 *
 * @author guowm
 * @date 2024-11-19
 */
@Configuration
public class ThreadPoolConfig {

    @Bean(name = "threadPoolExecutor")
    public ThreadPoolExecutor threadPoolExecutor() {
        //创建线程池
        ThreadPoolExecutor threadPool = new ThreadPoolExecutor(
                //线程池中的常驻核心线程数(假设银行窗口一般情况下开两个)
                3,
                //线程池能够容纳同时执行的最大线程数，此值必须>=1(特殊情况下比如周末办理业务人多，增设到5个窗口)
                5,
                //多余的空闲线程的存活时间 当前线程池数量超过 "corepoolsize"(认为有问题 应该是超过 maximumpoolsize吧)
                30,
                // 当空闲时间达到keepalivetime值时，多余空闲线程会被销毁直到只剩下 corePoolSize个线程为止
                //unit keepAliveTime的单位
                TimeUnit.SECONDS,
                //任务队列，被提交但尚未被执行的任务（银行窗口的等待区的座位）
                new LinkedBlockingQueue<>(20),
//                //线程工厂，用于生成线程池中的工作线程
//                new ThreadFactory("dataHandlePool") {
//                    @Override
//                    public Thread newThread(Runnable r) {
//                        return null;
//                    }
//                },
                //拒绝策略，当任务队列[LindedBlockingQueue]满了,
                // 并且工作线程[自己理解为办理业务的总认识，如以下代码中的10]大于等于线程池的最大线程数时如何拒绝多余工作线程
                new ThreadPoolExecutor.AbortPolicy()
        );
        threadPool.allowCoreThreadTimeOut(true);
        return threadPool;


    }


}
